﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Gustozzi.DAL;

namespace Gustozzi.BL
{
    public class PedidoBL
    {

        public const string cPedido_Pendiente="Pendiente";
        public const string cPedido_Anulado="Anulado";
        public const string cPedido_Observado="Observado";//Cuando se modifica el pedido
        public const string cPedido_Facturado = "Facturado";


        public int ActualizaPedido(Pedido oPedido, List<ItemPedido> lstItemsPedido,double igv)
        {
            try
            {
                VentasDataEntities contexto = new VentasDataEntities();
                
                double montoAntesImpuestos = 0;
                double montoDespuesImpuestos = 0;
                double montoIGV = 0;

                int codigoPedido = 0;

                if (oPedido.codigoPedido == 0)
                {
                    codigoPedido = (from p in contexto.Pedidos
                                    select p.codigoPedido).Max();

                    codigoPedido += 1;
                }
                else 
                {
                    codigoPedido = oPedido.codigoPedido;
                }


                if (lstItemsPedido != null)
                {
                    oPedido.codigoPedido = codigoPedido;
                    oPedido.PedidoDetalle = new System.Data.Objects.DataClasses.EntityCollection<PedidoItem>();
                    int codigoDetalleItem=1;
                    foreach (ItemPedido item in lstItemsPedido)
                    {
                        if (igv > 0)
                        {                           
                            double montoItem = item.importe / (1 + igv / 100);
                            montoItem = Math.Round(montoItem, 2);
                            double montoNetoItem = Math.Round(item.importe, 2);
                            double montoIGVItem = Math.Round(montoNetoItem - montoItem, 2);

                            montoAntesImpuestos += montoItem;
                            montoIGV += montoIGVItem;
                            montoDespuesImpuestos += montoNetoItem;

                            PedidoItem oPedidoItem = new PedidoItem();
                            oPedidoItem.codigoPedido = codigoPedido;
                            oPedidoItem.codigoPedidoDetalle = codigoDetalleItem;
                            codigoDetalleItem += 1;
                            oPedidoItem.cantidad = item.cantidad;
                            oPedidoItem.codigoProducto = item.codigoProducto;
                            if (item.codigoProducto == 0)
                            {
                                oPedidoItem.codigoProducto = null;
                            }
                            oPedidoItem.codigoPromocion = item.codigoPromocion;
                            if (item.codigoPromocion == 0)
                            {
                                oPedidoItem.codigoPromocion = null;
                            }
                            oPedidoItem.importe = item.importe;
                            oPedidoItem.precioUnitario = item.precioUnitario;
                            oPedido.PedidoDetalle.Add(oPedidoItem);
                        }
                    }
                }

                oPedido.montoNeto = montoAntesImpuestos;
                oPedido.montoImpuestos = montoIGV;
                oPedido.montoTotal = montoDespuesImpuestos;

                contexto.AddToPedidos(oPedido);

                return contexto.SaveChanges();
                
            }
            catch (Exception)
            {
                throw;
            }
        }

        public bool anulaPedido(int codigoPedido) 
        {
            if (codigoPedido > 0) 
            {
                VentasDataEntities contexto = new VentasDataEntities();
                
                Pedido oPedido= (Pedido)(from p in contexto.Pedidos 
                                         where p.codigoPedido==codigoPedido 
                                         select p);
                if (oPedido != null)
                {
                    throw new Exception("No se ha encontrado el pedido");
                }
                else 
                {
                    if (oPedido.estado == PedidoBL.cPedido_Anulado)
                    {
                        throw new Exception("No se puede anular un pedido ya anulado");
                    }
                    else 
                    {
                        oPedido.estado = PedidoBL.cPedido_Anulado;
                        int actualizado=contexto.SaveChanges();
                        if (actualizado > 0)
                            return true;
                    }
                }

            }
            return false;
        }
    }
}
